2

Javascripteval 函数可以在当前作用域执行一段包含 Javascript 代码的字符串。

var foo = 1;
function test() {
    var foo = 2;
    eval('foo = 3');
    return foo;
}
test(); // 3
foo; // 1

然而,eval 函数只有在当前作用域中直接被调用并且被调用的函数名为 eval 才会被执行。

var foo = 1;
function test() {
    var foo = 2;
    var bar = eval;
    bar('foo = 3');
    return foo;
}
test(); // 2
foo; // 3

eval 函数的使用应该被避免,99.9% 使用 eval 函数所实现的功能都可以通过不使用 eval 函数来实现。

伪装的 eval 函数

定时函数 setTimeoutsetInterval 函数都可以接受字符串作为自己的第一个参数。在全局作用域下,这个字符串会一直被执行,在这个情形下我们并没有直接调用 eval 函数,也可以执行字符串。

安全问题

eval 函数毫无疑问将会造成安全问题,因为它会执行任何传给它的字符串,所以永远不要对未知或未信任源传来的字符串使用 eval 函数。

总结

eval 函数应该尽可能地避免使用。任何使用 eval 函数的代码都应该被质疑。我觉得 @justjavac 前辈在 《js中eval()函数的用处?》 问题中的回答总结的很好,那就是“学习 eval 函数,并远离 eval 函数”。

参考

http://bonsaiden.github.io/JavaScript-Garden/#core.eval


StephenLi
7k 声望488 粉丝

知不足。